﻿using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Model.Tipologias;
using System.Collections;
using Model.Produtos;
using Model.Clientes;

namespace welwitschia.Produtos
{
    public partial class ProdutosDetalhe : PaginaBase
    {
        IProdutoService produtoservice = new ProdutoService();
        IGrupoProdutoService grupoService = new GrupoProdutoService();
        ITipologiaService tipologiaService = new TipologiaService();


        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {

                String cod = Request.QueryString["produtoId"];

                this.DropDownListUnidadeMedida.DataTextField = "Descricao";
                this.DropDownListUnidadeMedida.DataValueField = "Codigo";
                this.DropDownListUnidadeMedida.DataSource = tipologiaService.ObterPorTipo("UnidadeMedida");
                this.DropDownListUnidadeMedida.DataBind();

                this.DropDownListGrupo.DataTextField = "Nome";
                this.DropDownListGrupo.DataValueField = "CodGrupoProduto";
                this.DropDownListGrupo.DataSource = grupoService.ObterTodos();
                this.DropDownListGrupo.DataBind();

                this.DropDownListMoeda.DataTextField = "Descricao";
                this.DropDownListMoeda.DataValueField = "Codigo";
                this.DropDownListMoeda.DataSource = tipologiaService.ObterPorTipo("Moeda");
                this.DropDownListMoeda.DataBind();

                if (cod == null || String.IsNullOrEmpty(cod))
                {
                    LimpaDadosForm();
                    nbIdProduto.Enabled = true;
                    BindTreeViewFamilias(null);
                    return;
                }

                hfIdProduto.Value = cod;

                nbIdProduto.Enabled = false;
                Produto produto = produtoservice.ObterPorIdProduto(cod);

                this.nbIdProduto.Amount = produto.IdProduto;
                this.TextBoxNome.Text = produto.Nome;
                this.TextBoxDescricao.Text = produto.Descricao;

                this.DropDownListUnidadeMedida.SelectedValue = produto.UnidadeMedida.Codigo;

                this.nbPreco.Amount = produto.PrecoCusto;

                this.DropDownListGrupo.SelectedValue = produto.GrupoProduto.CodGrupoProduto;

                this.DropDownListMoeda.SelectedValue = produto.Moeda.Codigo;

                BindTreeViewFamilias(produto.GrupoProduto.CodGrupoProduto);
            }
        }

        private void LimpaDadosForm()
        {
            this.nbIdProduto.Amount = null;

            this.TextBoxNome.Text = String.Empty;
            this.TextBoxDescricao.Text = String.Empty;
            
            this.nbPreco.Amount = null;
        }

        protected void Unnamed2_Click(object sender, EventArgs e)
        {            
            Response.Redirect(@"~\Produtos\ProdutosLista.aspx");
        }

        protected void Unnamed1_Click(object sender, EventArgs e)
        {
            try
            {
                Produto produto = new Produto();

                produto.IdProduto = Convert.ToInt64(nbIdProduto.Amount.Value);
                produto.Nome = this.TextBoxNome.Text;
                produto.Descricao = this.TextBoxDescricao.Text;
                produto.PrecoCusto = nbPreco.Amount.Value;

                produto.Moeda = new Tipologia()
                {
                    Codigo = DropDownListMoeda.SelectedValue
                };

                produto.GrupoProduto = new GrupoProduto()
                {
                    CodGrupoProduto = DropDownListGrupo.SelectedValue
                };

                produto.UnidadeMedida = new Tipologia()
                {
                    Codigo = DropDownListUnidadeMedida.SelectedValue
                };

                if (String.IsNullOrEmpty(hfIdProduto.Value))
                    produtoservice.Insere(produto);
                else
                    produtoservice.Actualiza(produto);

                Response.Redirect(@"~\Produtos\ProdutosLista.aspx",false);
            }
            catch (Exception ex)
            {
                MostraErro(ex.Message);
            }
        }

        private Dictionary<String, TreeNode> _idxTreeView = new Dictionary<String, TreeNode>();


        private void BindTreeViewFamilias(String codGrupoProduto)
        {
            tvFamiliaProduto.Nodes.Clear();

            IGrupoProdutoService grupoProdutoService = new GrupoProdutoService();
            IList<GrupoProduto> grupoProdutos = grupoProdutoService.ObterTodos();

            IEnumerable<GrupoProduto> found = grupoProdutos.Where<GrupoProduto>(e => e.GrupoPai == null);
            foreach (GrupoProduto gp in found)
            {
                AddNode(gp, codGrupoProduto);
            }

            found = grupoProdutos.Where<GrupoProduto>(e => e.GrupoPai != null);
            foreach (GrupoProduto gp in found)
            {
                AddNode(gp, codGrupoProduto);
            }
        }

        private void AddNode(GrupoProduto grupoProduto, String codGrupoProduto)
        {
            TreeNode node = new TreeNode();
            node.Text = grupoProduto.Nome;
            node.Value = grupoProduto.CodGrupoProduto;
            if (!String.IsNullOrEmpty(codGrupoProduto))
            {
                if (codGrupoProduto == grupoProduto.CodGrupoProduto)
                    node.Select();
            }
            _idxTreeView.Add(grupoProduto.CodGrupoProduto, node);

            if (grupoProduto.GrupoPai != null)
            {
                TreeNode nodePai = _idxTreeView[grupoProduto.GrupoPai.CodGrupoProduto];
                nodePai.ChildNodes.Add(node);
            }
            else
            {
                tvFamiliaProduto.Nodes.Add(node);
            }
        }

        protected void tvFamiliaProduto_SelectedNodeChanged(object sender, EventArgs e)
        {
            DropDownListGrupo.SelectedValue = tvFamiliaProduto.SelectedValue;
        }
    }
}